const appData = require("../shared/appData");
const axios = require("axios");
const URL = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appData.appid}&secret=${appData.secrect}`; //向服务器获取accesstoken值
const fs = require("fs"); //引用fs文件管理
const path = require("path"); //引用路径
const fileName = path.resolve(__dirname, "./AccseeToken.json"); //文件路径

const updateAccessToken = async () => {
  //获取最新的accesstoken
  const res = await axios.get(URL); //发送请求
  const data = res.data; //获取请求数据
  if (data.access_token) {
    //如果成功获取则写入文件
    fs.writeFileSync(
      fileName,
      JSON.stringify({
        //写文件，JSON.stringify将对象转成字符串
        access_token: data.access_token, //写入当前获取到的accesstoken
        createTime: new Date().getTime(), //获取服务器时间
      })
    );
  } else {
    //如果没有获取到则再此执行
    await updateAccessToken();
  }
};

const getAccessToken = async () => {
  //读文件
  try {
    //异常处理
    const read = fs.readFileSync(fileName, "utf8"); //先获取文件
    const readObj = JSON.parse(read); //将获取到的字符串转成对象
    const createTime = Number(readObj.createTime);
    const nowTime = new Date().getTime(); //获取当前毫秒时间
    let access_token = readObj.access_token; //旧的access_token
    if ((nowTime - createTime) / 1000 >= 7200) {
      //当前时间减去创建时间除1000得出秒，如果当前秒大于等于7200小时则超出2小时该accesstoken过期
      await updateAccessToken(); //过期则重新获取
      access_token = await getAccessToken();
    }
    return access_token; //返回accesstoken值
  } catch {
    //如果获取不到文件，表示还没创建则执行
    await updateAccessToken();
    await getAccessToken();
  }
};

setInterval(async () => {
  await updateAccessToken();
}, (7200 - 300) * 1000);

module.exports = getAccessToken;
